// ES 3 or 5 的继承。

// // 构造函数。
// function A() {
    
// }

// // 构造函数特殊调用的关键字 new。作用：实例化和这个构造函数有关的一个实例对象。

// /**
//  * @var {A} a 一个对象。
//  */
// var a = null; // 它今后可能存储的是一个【对象】。C# -> A a = new A(); A a = null; var a = new A();

// new A(); // 实例化A类型的【实例】。

// var a = new A(); // a 是 A 实例化出来的【实例对象】

// new 关键字，会使整个内部的 this 指向你实例化的【实例】，如果左边赋值给了一个对象，那么 this === a === new A();

// 构造函数。实例化这个实例（对象）身上的属性。
function A(name = '', age) {
    this.name = name.toLowerCase();
    this.age = age || 18;

    this.hello = function () {
        console.log(this.name + '是' + this.age + '岁');
    }
}

A.prototype.hello2 = function () {
    console.log(this.name + '是' + this.age + '岁');
}

// const a = new A();
// a.name;

// const aa = new A();
// aa.name

// 继承。
function B(name, age) {
    // A(name)
    A.call(this, name, age)
}

B.prototype = Object.assign({}, A.prototype);
// B.prototype = new A();
B.prototype.constructor = B;

console.log(B.prototype);

var a = new B('YZY');
var aa = new B('FML', 20);

var c = new a.constructor('HAHA');

console.log(c);
// console.log(aa);

a.hello2();
aa.hello2();

console.log(a.hello2 === aa.hello2);